#include <iostream>
#include <string>
#include "Log.hpp"
#include "Listener.hpp"
#include "Connection.hpp"
#include "Reactor.hpp"

using namespace LogModule;

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cout << "Usage:" << argv[0] << "port" << std::endl;
        return 1;
    }
    ENABLE_CONSOLE_LOG();
    uint16_t local_port = std::stoi(argv[1]);
    Reactor reactor;

    //Listener listen(local_port);

    // EpollServer只对连接做管理，因此我们要把Listener封装成Connection，同时将Connection
    // 托管给EpollServer
    // auto conn = std::make_shared<Connection>(listen.Sockfd());
    // conn->InitCB([&listen]()
    //              { listen.Accepter(); },
    //              nullptr,
    //              nullptr);
    // conn->SetEvents(EPOLLIN | EPOLLET);
    // 再对conn建立连接的过程进行封装
    // auto conn = Factory::BuildConnection(listen.Sockfd(), EPOLLIN | EPOLLET, [&listen]()
    //                                      { listen.Accepter(); }, nullptr, nullptr);

    // auto conn = std::make_shared<Connection>(listen.Sockfd());
    // auto f = std::bind(&Listener::Accepter, &listen, conn, nullptr);
    // conn->InitCB(f, nullptr, nullptr);

    // 这个场景相当于是一个三层结构：最上层是最原始的Listener，中层是Connection，
    // 而最底层是EpollServer。

    auto conn = std::make_shared<Listener>(local_port);

    reactor.InsertConnection(conn);
    reactor.Loop();

    return 0;
}
